2. Repositorio de Infraestructura (Infrastructure Repository)

Es la implementación concreta del repositorio, ubicada en la capa de infraestructura. Utiliza JPA u otro mecanismo de persistencia para realizar las operaciones en la base de datos.

📌 Características:

✔️ Implementa la interfaz del repositorio de dominio.
✔️ Usa Spring Data JPA o cualquier tecnología de persistencia.
✔️ Traduce las operaciones del dominio a consultas en la base de datos.

📌 Ejemplo (AvionJpaRepository.java) en la capa de Infraestructura:

📂 com.vortechgroup.prueba_tecnica.gestionvuelos.app.infrastructure.adapters.persistence

🔹 Aquí implementamos la lógica de persistencia usando Spring Data JPA.


🔹 3. Definiendo SpringDataAvionRepository

Para usar Spring Data JPA, definimos un repositorio basado en JpaRepository.

📂 com.vortechgroup.prueba_tecnica.gestionvuelos.app.infrastructure.adapters.persistence

🔹 SpringDataAvionRepository extiende JpaRepository, permitiendo acceder a métodos como save, delete, findById, etc.


🔹 4. ¿Por qué separar Repositorios en Hexagonal?

📌 Ventajas:

1️⃣ Desacoplamiento → La capa de dominio no depende de JPA ni de ninguna tecnología de persistencia.
2️⃣ Pruebas unitarias más fáciles → Puedes testear la lógica sin necesidad de conectarte a una BD.
3️⃣ Flexibilidad → Si decides cambiar PostgreSQL por MongoDB, solo modificas la capa de infraestructura.
4️⃣ Cumple con el Principio de Inversión de Dependencias (D de SOLID) → La capa de infraestructura depende del dominio, no al revés.

📌 Ejemplo de Inyección en un Caso de Uso:

🔹 Aquí el servicio usa la abstracción (AvionRepository), sin importar la implementación concreta.


Resumen

Repositorio Ubicación Propósito Implementa
Repositorio de Dominio Capa de Dominio Define el contrato (qué operaciones se deben hacer) No tiene implementación concreta
Repositorio de Infraestructura Capa de Infraestructura Implementa las operaciones con JPA Usa JpaRepository y tecnologías específicas

🎯 Con esta separación, la capa de dominio no depende de ninguna tecnología de persistencia, manteniendo la aplicación flexible y fácil de probar. 🚀